// Dart 抽象类与接口完整示例

// 抽象类：定义了规范 + 可包含部分实现
abstract class Animal {
  // 抽象方法（无方法体，子类必须实现）
  void makeSound();

  // 普通方法（有默认实现，可被继承或重写）
  void eat() {
    print("Animal is eating...");
  }
}

// 接口风格类：纯规范（没有任何实现）
class Runner {
  void run() {}
}

class Flyer {
  void fly() {}
}

// 子类继承抽象类 + 实现多个接口
class Bird extends Animal implements Runner, Flyer {
  @override
  void makeSound() {
    print("Chirp chirp! 🐦");
  }

  @override
  void run() {
    print("Bird runs on the ground 🏃‍♂️");
  }

  @override
  void fly() {
    print("Bird is flying high! 🕊️");
  }

  // 可选：重写父类已实现的方法
  @override
  void eat() {
    print("Bird pecks at seeds 🌾");
  }
}

// 第二个子类（继承抽象类但不实现接口）
class Dog extends Animal {
  @override
  void makeSound() {
    print("Woof! 🐶");
  }

  // 使用父类默认实现的 eat()
}

// 纯接口实现：不继承逻辑，只是遵守规范
class Robot implements Runner, Flyer {
  @override
  void run() {
    print("Robot is running on wheels 🤖");
  }

  @override
  void fly() {
    print("Robot uses jet boosters to fly 🚀");
  }
}

// 主函数测试
void main() {
  print("=== Bird 示例（抽象类 + 接口） ===");
  var bird = Bird();
  bird.makeSound();
  bird.eat();
  bird.run();
  bird.fly();

  print("\n=== Dog 示例（仅继承抽象类） ===");
  var dog = Dog();
  dog.makeSound();
  dog.eat();

  print("\n=== Robot 示例（仅实现接口） ===");
  var robot = Robot();
  robot.run();
  robot.fly();
}
